home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / tex / td187src.lzh / TEXTBOX.I < prev    next >
Text File  |  1991-12-14  |  51KB  |  1,628 lines

  1. IMPLEMENTATION MODULE TextBox ;
  2.  
  3. FROM SYSTEM   IMPORT ADDRESS , ADR;
  4. FROM Storage  IMPORT ALLOCATE , DEALLOCATE ;
  5. FROM OwnBoxes IMPORT MousePos, WaitForDepress;
  6.  
  7. IMPORT CommonData ;
  8. IMPORT Diverses;
  9. IMPORT Fill;
  10. IMPORT HelpModule ;
  11. IMPORT MagicAES ;
  12. IMPORT MagicBIOS ;
  13. IMPORT MagicStrings;
  14. IMPORT MagicSys;
  15. IMPORT MagicVDI ;
  16. IMPORT MathLib0;
  17. IMPORT mtAppl ;
  18. IMPORT Types;
  19. IMPORT Undo;
  20. IMPORT Variablen ;
  21. IMPORT VectorFont;
  22.  
  23. (**
  24. IMPORT RTD;
  25. **)
  26.  
  27. CONST UseXBIOS     = FALSE;
  28.  
  29. TYPE XYArray       = ARRAY [0..3] OF INTEGER;
  30.  
  31. VAR AlignMode      : INTEGER;
  32.     Internal       : BOOLEAN;
  33.     VectorFontMode : BOOLEAN;
  34.     storesize      : LONGREAL;
  35.     storeslant     : LONGREAL;
  36.     storeangle     : INTEGER;
  37.  
  38.  
  39. PROCEDURE SetVectorText(On : BOOLEAN);
  40. (*
  41.    Schaltet auf Vektor-Zeichensatz um;
  42.    standardmäßig jedoch ausgeschaltet.
  43. *)
  44. BEGIN
  45.   VectorFontMode := On;
  46.   IF VectorFontMode THEN
  47.     VectorFontMode := VectorFont.FontsLoaded()>0;
  48.   END;
  49. END SetVectorText;
  50.  
  51. PROCEDURE RoundedRect(pxy : ARRAY OF INTEGER);
  52. VAR maxradius    : INTEGER;
  53.     min          : INTEGER;
  54.     radius       : INTEGER;
  55.     MinX, MinY   : INTEGER;
  56.     distx, disty : INTEGER;
  57.     line         : ARRAY [0..3] OF INTEGER;
  58.  
  59. BEGIN
  60.   maxradius := Variablen.MaxCircle();
  61.   maxradius := Variablen.PicDistance(maxradius);
  62.   MinX := Diverses.min(pxy[0], pxy[2]);
  63.   MinY := Diverses.min(pxy[1], pxy[3]);
  64.   min  := Diverses.min(ABS(pxy[2] - pxy[0]), ABS(pxy[3] - pxy[1]));
  65.   radius := Variablen.PicDistance(min DIV 2);
  66.   IF radius>maxradius THEN radius := maxradius; END;
  67.   IF min>0 THEN
  68.     distx := ABS(pxy[2] - pxy[0]) - 2*radius;
  69.     disty := ABS(pxy[3] - pxy[1]) - 2*radius;
  70.     (* Zeichne die 4 Eckkreise *)
  71.     (* Links oben *)
  72.      MagicVDI.Arc (mtAppl.VDIHandle , MinX + radius, MinY + radius,
  73.                    radius , 900 , 1800) ;
  74.     (* Links unten *)
  75.      MagicVDI.Arc (mtAppl.VDIHandle , MinX + radius, MinY + radius + disty,
  76.                    radius , 1800 , 2700) ;
  77.     (* Rechts unten *)
  78.      MagicVDI.Arc (mtAppl.VDIHandle , MinX + radius + distx, MinY + radius + disty,
  79.                    radius , 2700 , 3600) ;
  80.     (* Rechts oben *)
  81.      MagicVDI.Arc (mtAppl.VDIHandle , MinX + radius + distx, MinY + radius,
  82.                    radius , 0 , 900) ;
  83.     (* Und dann die Zwischenlinien *)
  84.     IF distx>0 THEN
  85.       line[0] := MinX + radius;         line[1] := pxy[1];
  86.       line[2] := MinX + radius + distx; line[3] := pxy[1];
  87.       MagicVDI.Polyline (mtAppl.VDIHandle , 2 , line) ;
  88.       line[1] := pxy[3];
  89.       line[3] := pxy[3];
  90.       MagicVDI.Polyline (mtAppl.VDIHandle , 2 , line) ;
  91.     END;
  92.     IF disty>0 THEN
  93.       line[0] := pxy[0];
  94.       line[1] := MinY + radius;
  95.       line[2] := pxy[0];
  96.       line[3] := MinY + radius + disty;
  97.       MagicVDI.Polyline (mtAppl.VDIHandle , 2 , line) ;
  98.       line[0] := pxy[2];
  99.       line[2] := pxy[2];
  100.       MagicVDI.Polyline (mtAppl.VDIHandle , 2 , line) ;
  101.     END;
  102.   END;
  103. END RoundedRect;
  104.  
  105. PROCEDURE FillBox(x1, y1, x2, y2 : INTEGER);
  106. VAR pxy : XYArray;
  107.     i   : INTEGER;
  108. BEGIN
  109.   IF x1<x2 THEN
  110.     pxy[0] := x1; pxy[2] := x2;
  111.    ELSE
  112.     pxy[0] := x2; pxy[2] := x1;
  113.   END;
  114.   IF y1<y2 THEN
  115.     pxy[1] := y1; pxy[3] := y2;
  116.    ELSE
  117.     pxy[1] := y2; pxy[3] := y1;
  118.   END;
  119.   IF (x1<>x2) AND (y1<>y2) THEN
  120. (**
  121.     FOR i:=0 TO 3 DO
  122.       RTD.ShowVar('pxy', pxy[i]);
  123.     END;
  124. **)
  125.     MagicVDI.SetClipping (mtAppl.VDIHandle  , CommonData.ClipXY , TRUE) ;
  126.     MagicVDI.FillRectangle(mtAppl.VDIHandle, pxy);
  127.     MagicVDI.SetClipping (mtAppl.VDIHandle  , CommonData.ClipXY , FALSE) ;
  128.   END;
  129. END FillBox;
  130.  
  131. PROCEDURE MakeBox (Style, FillMode : INTEGER ;
  132.                     VAR XY : XYArray) : BOOLEAN ;
  133.  
  134.  
  135. VAR
  136.     dum, x, y,
  137.     xo, yo, i,
  138.     picx, picy : INTEGER ;
  139.     xy , xyo   : ARRAY [ 0..9 ] OF INTEGER ;
  140.     PxyArray   : XYArray;
  141.     result     : BOOLEAN;
  142.     delete     : BOOLEAN;
  143.     lbut, rbut : BOOLEAN;
  144.  
  145. (* Style = -1 => RoundedBox *)
  146. (* Style = -2 => FrameBox (wobei Box später gelöscht wird) *)
  147.  
  148. BEGIN
  149. (**
  150.   RTD.Into('MakeBox');
  151. **)
  152.   WaitForDepress(x, y);
  153. (**
  154.   RTD.Message('Buttons released');
  155. **)
  156.   MagicVDI.SetLineEndstyles (mtAppl.VDIHandle , MagicVDI.Cornerd , MagicVDI.Cornerd) ;
  157. (**
  158.   RTD.Message('EndStyle ready');
  159. **)
  160.  
  161.   IF Style=-2 THEN
  162.     Style  := 1;
  163.     delete := TRUE;
  164.    ELSE
  165.     delete := FALSE;
  166.   END;
  167.   IF Style <> -1 THEN
  168.     dum := MagicVDI.SetLinetype (mtAppl.VDIHandle ,  Style) ;
  169.    ELSE
  170.     dum := MagicVDI.SetLinetype (mtAppl.VDIHandle ,  MagicVDI.Line) ;
  171.   END;
  172. (**
  173.   RTD.Message('Linetype ready');
  174. **)
  175.  
  176.   IF (Style=1) AND delete THEN
  177.     dum := MagicVDI.SetLinewidth (mtAppl.VDIHandle , 1);
  178.    ELSE
  179.     dum := MagicVDI.SetLinewidth (mtAppl.VDIHandle ,
  180.                                      CommonData.LineWidth) ;
  181.   END;
  182. (**
  183.   RTD.Message('Linewidth ready');
  184. **)
  185.   dum := MagicVDI.SetLinecolor (mtAppl.VDIHandle , MagicAES.BLACK) ;
  186. (**
  187.   RTD.Message('Linecolor ready');
  188. **)
  189.  
  190.   FOR i := 0 TO 4 DO
  191.     xy  [ 2*i ] := x ;
  192.     xyo [ 2*i ] := x ;
  193.     xy  [ 2*i + 1 ] := y ;
  194.     xyo [ 2*i + 1 ] := y ;
  195.   END ;
  196.   xo := x ; yo:=y ;
  197.  
  198. (**
  199.   RTD.Message('Entering repeat...');
  200. **)
  201.   REPEAT
  202.     MousePos(x, y, picx, picy, lbut, rbut);
  203.     Variablen.Position (TRUE, x, y, xy[0], xy[1]) ;
  204.  
  205.     IF (x <> xo) OR (y <> yo) THEN
  206.  
  207.       IF Style<>-1 THEN
  208.         xy [ 2 ] := x ; xy [ 4 ] := x ;
  209.         xy [ 5 ] := y ; xy [ 7 ] := y ;
  210.       ELSE
  211.         xy [ 2 ] := x; xy [ 3 ] := y;
  212.       END;
  213.  
  214. (**
  215.       RTD.Message('Init. start');
  216. **)
  217.       dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.XOR) ;
  218.       MagicVDI.SetClipping (mtAppl.VDIHandle  , CommonData.ClipXY , TRUE) ;
  219.       Diverses.MouseOff;
  220. (**
  221.       RTD.Message('Init. end');
  222. **)
  223.       IF Style<>-1 THEN
  224.         dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.XOR) ;
  225.         MagicVDI.Polyline (mtAppl.VDIHandle , 5 , xyo) ;
  226.         MagicVDI.Polyline (mtAppl.VDIHandle , 5 , xy) ;
  227.         IF (FillMode>=0) THEN
  228.           Fill.SetFillMode(FillMode);
  229. (**
  230.           RTD.Message('Set Clip');
  231. **)
  232.           MagicVDI.SetClipping (mtAppl.VDIHandle  , CommonData.ClipXY , TRUE) ;
  233. (**
  234.           RTD.Message('Set WriteMode');
  235. **)
  236.           dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.XOR) ;
  237.  
  238.           FillBox(xyo[0], xyo[1], xyo[4], xyo[5]);
  239.           FillBox(xy[0], xy[1], xy[4], xy[5]);
  240. (*
  241.           MagicVDI.FilledArea(mtAppl.VDIHandle , 5, xyo);
  242.           MagicVDI.FilledArea(mtAppl.VDIHandle , 5, xy);
  243. *)
  244.           Fill.SetFillMode(-1);
  245.         END;
  246.        ELSE
  247.         FOR i := 0 TO 3 DO
  248.           PxyArray[i] := xyo[i];
  249.         END;
  250.         RoundedRect (PxyArray);
  251.         FOR i := 0 TO 3 DO
  252.           PxyArray[i] := xy[i];
  253.         END;
  254.         RoundedRect (PxyArray);
  255.       END;
  256.       Diverses.MouseOn;
  257.       MagicVDI.SetClipping (mtAppl.VDIHandle  , CommonData.ClipXY , FALSE) ;
  258.       dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.REPLACE) ;
  259.       IF Style<> -1 THEN
  260.         xyo [ 2 ] := x ; xyo [ 4 ] := x ;
  261.         xyo [ 5 ] := y ; xyo [ 7 ] := y ;
  262.        ELSE
  263.         xyo [ 2 ] := x ; xyo [ 3 ] := y ;
  264.       END;
  265.       xo := x ; yo := y ;
  266.  
  267.     END ;
  268.  
  269.   UNTIL lbut OR rbut;
  270.  
  271.   dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.XOR) ;
  272.   MagicVDI.SetClipping (mtAppl.VDIHandle  , CommonData.ClipXY , TRUE) ;
  273.   Diverses.MouseOff;
  274.   IF Style<>-1 THEN
  275.     IF (FillMode>=0) THEN
  276.       Fill.SetFillMode(FillMode);
  277.       dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.XOR) ;
  278.       FillBox(xy[0], xy[1], xy[4], xy[5]);
  279.       Fill.SetFillMode(-1);
  280.     END;
  281.     MagicVDI.Polyline (mtAppl.VDIHandle , 5 , xy) ;
  282.    ELSE
  283.     FOR i := 0 TO 3 DO
  284.       PxyArray[i] := xy[i];
  285.     END;
  286.     RoundedRect (PxyArray);
  287.   END;
  288.   Diverses.MouseOn;
  289.   MagicVDI.SetClipping (mtAppl.VDIHandle  , CommonData.ClipXY , FALSE) ;
  290.   dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.REPLACE) ;
  291.   IF lbut AND NOT rbut THEN
  292.     IF NOT delete THEN
  293.       dum := MagicVDI.SetWritemode (mtAppl.VDIHandle , MagicVDI.REPLACE) ;
  294.       MagicVDI.SetClipping (mtAppl.VDIHand